package br.com.sixsoftware.helpdesk.business;

import java.util.List;

import javax.inject.Inject;

import org.apache.commons.lang.StringUtils;

import br.com.sixsoftware.helpdesk.domain.Cliente;
import br.com.sixsoftware.helpdesk.domain.Funcionario;
import br.com.sixsoftware.helpdesk.domain.SolicitacaoServico;
import br.com.sixsoftware.helpdesk.domain.StatusServico;
import br.com.sixsoftware.helpdesk.exception.NegocioException;
import br.com.sixsoftware.helpdesk.persistence.SolicitacaoServicoDAO;
import br.com.sixsoftware.helpdesk.util.SessaoUsuario;
import br.gov.frameworkdemoiselle.stereotype.BusinessController;
import br.gov.frameworkdemoiselle.template.DelegateCrud;

@BusinessController
public class SolicitacaoServicoBC extends DelegateCrud<SolicitacaoServico, Long, SolicitacaoServicoDAO> {

	private static final long serialVersionUID = 1L;

	@Inject
	private SessaoUsuario sessaoUsuario;

	public void inserirSolicitacaoServico(SolicitacaoServico solicitacaoServico) throws NegocioException {
		solicitacaoServico.setClienteSolicitante((Cliente) sessaoUsuario.getUsuarioAtual());
		solicitacaoServico.setStatusServico(StatusServico.ABERTO);
		getDelegate().inserirSolicitacaoServico(solicitacaoServico);
	}

	public void alterarSolicitacaoServico(SolicitacaoServico solicitacaoServico) throws NegocioException {
		getDelegate().alterarSolicitacaoServico(solicitacaoServico);
	}

	public void alterarSolicitacaoServico(SolicitacaoServico solicitacaoServico, String observacao)
			throws NegocioException {
		if (StringUtils.isNotEmpty(observacao)) {
			solicitacaoServico.setStatusServico(StatusServico.AGUARDANDO_ATENDENTE);
			solicitacaoServico.getListaObservacoes().add(
					"Cliente " + solicitacaoServico.getClienteSolicitante().getNome() + ": " + observacao);
		}else {
			throw new NegocioException("Por favor informe as informações solicitadas.");
		}
	}

	public List<SolicitacaoServico> listarTodosSolicitacaoServicosCliente(Cliente cliente) throws NegocioException {
		List<SolicitacaoServico> listaSolicitacaoServicos = getDelegate()
				.listarTodosSolicitacaoServicosCliente(cliente);
		if (listaSolicitacaoServicos.isEmpty()) {
			throw new NegocioException("Não foram encontradas solicitações de serviço cadastradas no sistema");
		} else {
			return listaSolicitacaoServicos;
		}
	}

	public List<SolicitacaoServico> listarTodosSolicitacaoServicosPendente() throws NegocioException {
		List<SolicitacaoServico> listaSolicitacaoServicos = getDelegate().listarTodosSolicitacaoServicosPendente();
		if (listaSolicitacaoServicos.isEmpty()) {
			throw new NegocioException("Não foram encontradas solicitações de serviço pendentes cadastradas no sistema");
		} else {
			return listaSolicitacaoServicos;
		}
	}

	public void atenderSolicitacaoServico(SolicitacaoServico solicitacaoServico, String observacao)
			throws NegocioException {
		solicitacaoServico.setFuncionarioAtendente(((Funcionario) sessaoUsuario.getUsuarioAtual()));
		if (StringUtils.isEmpty(observacao)) {
			solicitacaoServico.setStatusServico(StatusServico.FECHADO);
		} else {
			solicitacaoServico.setStatusServico(StatusServico.AGUARDANDO_CLIENTE);
			solicitacaoServico.getListaObservacoes().add(
					"Atendente " + solicitacaoServico.getFuncionarioAtendente().getNome() + ": " + observacao);
		}
		alterarSolicitacaoServico(solicitacaoServico);
	}
}
